import random
import re
from datetime import datetime

from flask import abort,make_response, jsonify
from flask import current_app
from flask import request,redirect,url_for
from flask import session

from info import sr, db
from info.constants import IMAGE_CODE_REDIS_EXPIRES
from info.libs.captcha.pic_captcha import captcha
from info.models import User
from info.modules.passport import passport_blu
from info.utlis.response_code import RET, error_map

#获取图片验证码
@passport_blu.route('/get_img_code')
def get_img_code():
    #获取参数
    img_code_id = request.args.get("img_code_id")
    #校验参数 如果没有参数就直接返回４０３拒绝访问
    if not img_code_id:
        return abort(403)
    #生成图片验证码
    #验证码名字，验证码文字，验证码二进制数据
    img_name,img_code,img_bytes = captcha.generate_captcha()
    #保存验证码文字和图片ｋｅｙ　　设置过期时间　　
    try:
        sr.set("img_code_id" + img_code_id,img_code,ex=IMAGE_CODE_REDIS_EXPIRES)
    except BaseException as e:
        current_app.logger.error(e)
        return abort(500)#５００代表服务器错误

    #返回图片
    response = make_response(img_bytes)
    response.content_type = "image/jpeg"
    return response


#获取短信验证码
@passport_blu.route("/get_sms_code",methods=["POST"])
def get_sms_code():
    #获取参数
    img_code_id = request.json.get("img_code_id")
    img_code = request.json.get("img_code")
    mobile = request.json.get("mobile")

    #校验图片验证码是否有
    if not all([img_code_id,img_code,mobile]):
        return jsonify(errno=RET.PARAMERR,errmsg=error_map[RET.PARAMERR])
    #校验手机格式
    if not re.match(r"1[345678]\d{9}$",mobile):
        return jsonify(errno=RET.PARAMERR,errmsg=error_map[RET.PARAMERR])

    #取出验证码
    try:
        real_img_code = sr.get("img_code_id" + img_code_id)
    except BaseException as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR,errmsg=error_map[RET.DBERR])
    #验证码是否对
    if real_img_code != img_code.upper():
        return jsonify(errno=RET.UNKOWNERR,errmsg=error_map[RET.UNKOWNERR])

    #判断用户是否存在
    try:
        user = User.query.filter_by(mobile=mobile).first()
    except BaseException as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR,errmsg=error_map[RET.DBERR])
    if user:
        return jsonify(error=RET.DATAEXIST,errmsg=error_map[RET.DATAEXIST])

    #发送短信
    rand_num = "%04d"%random.randint(0,9999)

    #保存短信验证码
    try:
        sr.set("sms_code_id" + mobile,rand_num,ex=300)
    except BaseException as e:
        return jsonify(erron=RET.DBERR,errmsg=error_map[RET.DBERR])
    #打印短信验证码
    current_app.logger.info("短信验证码为：%s"% rand_num)

    #json返回结果是否正确
    return jsonify(errno=RET.OK,errmsg=error_map[RET.OK])

#用户注册
@passport_blu.route("/register",methods=["POST"])
def register():
    #获取请求信息
    mobile = request.json.get("mobile")
    password = request.json.get("password")
    sms_code = request.json.get("sms_code")
    #验证信息
    if not ([mobile,password,sms_code]):
        return jsonify(errno=RET.PARAMERR,errmsg=error_map[RET.PARAMERR])

    #校验短信验证码
    rand_num = sr.get("sms_code_id" + mobile)
    if sms_code != rand_num:
        return jsonify(errno=RET.PARAMERR,errmsg=error_map[RET.PARAMERR])

    #保存用户数据
    try:
        user = User()
        user.mobile = mobile
        #封装加密过程
        user.password = password
        #记录最后登录时间
        user.last_login = datetime.now()
        user.nick_name = mobile
        db.session.add(user)
        db.session.commit()
    except BaseException as e:
        current_app.logger.error(e)
        db.session.rollback()
        return jsonify(erron=RET.DBERR,errmsg=error_map[RET.DBERR])
    #对用户信息进行状态保持
    session["user_id"] = user.id

    #ｊｓｏｎ返回结果
    return jsonify(errno=RET.OK,errmsg=error_map[RET.OK])

#登陆页面
@passport_blu.route("/login",methods=["POST"])
def login():
    #获取请求信息　　用户手机号　　密码
    mobile = request.json.get("mobile")
    password = request.json.get("password")
    #判断是否存在
    if not all([mobile,password]):
        return jsonify(errno=RET.PARAMERR,errmsg=error_map[RET.PARAMERR])
    #验证账号和密码
    try:
        user = User.query.filter_by(mobile=mobile).first()
    except BaseException as e:
        current_app.lgger.error(e)
        return jsonify(erron=RET.DBERR,errmsg=error_map[RET.DBERR])
    if not user:
        return jsonify(erron=RET.NODATA,errmsg=error_map[RET.NODATA])
    #校验密码
    if  not user.check_password(password):
        return  jsonify(errno=RET.PARAMERR,errmsg=error_map[RET.PARAMERR])
    #状态保持
    session["user_id"]=user.id
    #记录最后登陆时间
    user.last_login = datetime.now()
    #返回主页　json方式
    return jsonify(errno=RET.OK,errmsg=error_map[RET.OK])

#退出界面
@passport_blu.route("/logout")
def logout():
    #直接删除ｓｅｓｓｉｏｎ中保存的ｕｓｅ_id
    session.pop("user_id",None)
    return jsonify(errno=RET.OK,errmsg=error_map[RET.OK])

